package ManagedBeans;

import ComponenteDatos.IngresosFacadeLocal;
import ComponenteEntidad.Ingresos;
import ComponenteDatos.EgresosFacadeLocal;
import ComponenteEntidad.Egresos;
import ComponenteDatos.VentasFacadeLocal;
import ComponenteEntidad.Ventas;
import ComponenteDatos.EncomiendaFacadeLocal;
import ComponenteEntidad.Encomienda;
import ComponenteDatos.ViajeFacadeLocal;
import ComponenteEntidad.Agencia;
import ComponenteEntidad.Viaje;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@SessionScoped
public class ManagedBeanFlujoCaja implements Serializable {

    @EJB
    private IngresosFacadeLocal IngresosFacade;
    @EJB
    private EgresosFacadeLocal EgresosFacade;
    @EJB
    private VentasFacadeLocal VentasFacade;
    @EJB
    private EncomiendaFacadeLocal EncomiendaFacade;
    @EJB
    private ViajeFacadeLocal ViajeFacade;
    private List<Ingresos> lista;
    private List<Egresos> lista1;
    private List<Ventas> lista2;
    private List<Encomienda> lista3;
    private List<Viaje> lista4;
    private List<Viaje> lista5;
    private Date fechaInicial;
    private Date fechaFinal;
    private BigDecimal montofinalIngresos = new BigDecimal(0);
    private BigDecimal montofinalEgresos = new BigDecimal(0);
    private BigDecimal montofinalVentas = new BigDecimal(0);
    private BigDecimal montofinalEncomienda = new BigDecimal(0);
    private BigDecimal montoTotalIngresos = new BigDecimal(0);
    private BigDecimal postergados = new BigDecimal(0);
    private BigDecimal saldoNeto = new BigDecimal(0);
    private Agencia objetoAgencia;
    private String datosAgencia;
    private String datosFechas;

    public ManagedBeanFlujoCaja() {
        lista = new LinkedList<Ingresos>();
        lista1 = new LinkedList<Egresos>();
        lista2 = new LinkedList<Ventas>();
        lista3 = new LinkedList<Encomienda>();
        lista4 = new LinkedList<Viaje>();
        lista5 = new LinkedList<Viaje>();
        fechaInicial = null;
        fechaFinal = null;
        objetoAgencia = new Agencia();
        datosAgencia = "";
        datosFechas = "";
    }

    public Agencia getObjetoAgencia() {
        return objetoAgencia;
    }

    public void setObjetoAgencia(Agencia objetoAgencia) {
        this.objetoAgencia = objetoAgencia;
    }

    public BigDecimal getMontoTotalIngresos() {
        return montoTotalIngresos;
    }

    public void setMontoTotalIngresos(BigDecimal montoTotalIngresos) {
        this.montoTotalIngresos = montoTotalIngresos;
    }

    public List<Viaje> getLista5() {
        return lista5;
    }

    public void setLista5(List<Viaje> lista5) {
        this.lista5 = lista5;
    }

    public List<Viaje> getLista4() {
        return lista4;
    }

    public void setLista4(List<Viaje> lista4) {
        this.lista4 = lista4;
    }

    public BigDecimal getPostergados() {
        return postergados;
    }

    public void setPostergados(BigDecimal postergados) {
        this.postergados = postergados;
    }

    public List<Encomienda> getLista3() {
        return lista3;
    }

    public void setLista3(List<Encomienda> lista3) {
        this.lista3 = lista3;
    }

    public BigDecimal getMontofinalEncomienda() {
        return montofinalEncomienda;
    }

    public void setMontofinalEncomienda(BigDecimal montofinalEncomienda) {
        this.montofinalEncomienda = montofinalEncomienda;
    }

    public List<Ventas> getLista2() {
        return lista2;
    }

    public void setLista2(List<Ventas> lista2) {
        this.lista2 = lista2;
    }

    public BigDecimal getMontofinalVentas() {
        return montofinalVentas;
    }

    public void setMontofinalVentas(BigDecimal montofinalVentas) {
        this.montofinalVentas = montofinalVentas;
    }

    public BigDecimal getSaldoNeto() {
        return saldoNeto;
    }

    public void setSaldoNeto(BigDecimal saldoNeto) {
        this.saldoNeto = saldoNeto;
    }

    public Date getFechaInicial() {
        return fechaInicial;
    }

    public void setFechaInicial(Date fechaInicial) {
        this.fechaInicial = fechaInicial;
    }

    public Date getFechaFinal() {
        return fechaFinal;
    }

    public void setFechaFinal(Date fechaFinal) {
        this.fechaFinal = fechaFinal;
    }

    public List<Egresos> getLista1() {
        return lista1;
    }

    public void setLista1(List<Egresos> lista1) {
        this.lista1 = lista1;
    }

    public List<Ingresos> getLista() {
        return lista;
    }

    public void setLista(List<Ingresos> lista) {
        this.lista = lista;
    }

    public BigDecimal getMontofinalIngresos() {
        return montofinalIngresos;
    }

    public void setMontofinalIngresos(BigDecimal montofinalIngresos) {
        this.montofinalIngresos = montofinalIngresos;
    }

    public BigDecimal getMontofinalEgresos() {
        return montofinalEgresos;
    }

    public void setMontofinalEgresos(BigDecimal montofinalEgresos) {
        this.montofinalEgresos = montofinalEgresos;
    }

    public String getDatosAgencia() {
        return datosAgencia;
    }

    public void setDatosAgencia(String datosAgencia) {
        this.datosAgencia = datosAgencia;
    }

    public String getDatosFechas() {
        return datosFechas;
    }

    public void setDatosFechas(String datosFechas) {
        this.datosFechas = datosFechas;
    }

    public void calcular() {
        saldoNeto = new BigDecimal(0);
        datosFechas = "(del " + formatearFecha(fechaInicial) + " al " + formatearFecha(fechaFinal) + ")";
        if (fechaInicial.after(fechaFinal)) {
            FacesMessage msg = new FacesMessage("Informacion", "Fecha Final debe ser mayor a la Fecha Inicial");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return;
        }
        lista = new LinkedList<Ingresos>();
        montofinalIngresos = new BigDecimal(0);
        List<Ingresos> listaTemporal = new LinkedList<Ingresos>();
        listaTemporal = IngresosFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getIngEstado() == true) {
                if ((listaTemporal.get(i).getIngFecha().after(fechaInicial) && listaTemporal.get(i).getIngFecha().before(fechaFinal)) || (listaTemporal.get(i).getIngFecha().equals(fechaInicial)) || (listaTemporal.get(i).getIngFecha().equals(fechaFinal))) {
                    lista.add(listaTemporal.get(i));
                    montofinalIngresos = montofinalIngresos.add(listaTemporal.get(i).getIngMonto());
                }
            }
        }

        List<Ventas> listaTemporal2 = new LinkedList<Ventas>();

        lista4 = new LinkedList<Viaje>();
        montofinalVentas = new BigDecimal(0);
        postergados = new BigDecimal(0);
        List<Viaje> listaTemporal4 = new LinkedList<Viaje>();
        listaTemporal4 = ViajeFacade.findAll();
        for (int j = listaTemporal4.size() - 1; j >= 0; j--) {
            if (listaTemporal4.get(j).getViaEstado() == true && (listaTemporal4.get(j).getViaFehaSalida().after(fechaInicial) || (listaTemporal4.get(j).getViaFehaSalida().equals(fechaInicial)))) {
                listaTemporal2 = listaTemporal4.get(j).getVentasList();
                BigDecimal montoVentas = new BigDecimal(0);
                BigDecimal montoPstergado = new BigDecimal(0);
                for (int i = listaTemporal2.size() - 1; i >= 0; i--) {
                    if ((listaTemporal2.get(i).getVenFechaCreacion().after(fechaInicial) && listaTemporal2.get(i).getVenFechaCreacion().before(fechaFinal)) || (listaTemporal2.get(i).getVenFechaCreacion().equals(fechaInicial)) || (listaTemporal2.get(i).getVenFechaCreacion().equals(fechaFinal))) {
                        if (listaTemporal2.get(i).getVenEstado() == 1 && listaTemporal2.get(i).getTipopago().getIdTipoPago() == 1) {
                            lista2.add(listaTemporal2.get(i));
                            montoVentas = montoVentas.add(listaTemporal2.get(i).getVenMonto());
                        }

                        if (listaTemporal2.get(i).getVenPostergado() == true) {
                            lista2.add(listaTemporal2.get(i));
                            montoPstergado = montoPstergado.add(listaTemporal2.get(i).getVenMonto());
                        }
                    }
                }
                lista4.add(listaTemporal4.get(j));
                listaTemporal4.get(j).setViaPrecio(montoVentas);
                montofinalVentas = montofinalVentas.add(montoVentas);
                postergados = postergados.add(montoPstergado);

            }
        }

        List<Encomienda> listaTemporal3 = new LinkedList<Encomienda>();

        lista5 = new LinkedList<Viaje>();
        montofinalEncomienda = new BigDecimal(0);
        List<Viaje> listaTemporal5 = new LinkedList<Viaje>();
        listaTemporal5 = ViajeFacade.findAll();
        for (int j = listaTemporal5.size() - 1; j >= 0; j--) {
            if (listaTemporal5.get(j).getViaEstado() == true  && (listaTemporal5.get(j).getViaFehaSalida().after(fechaInicial) || (listaTemporal5.get(j).getViaFehaSalida().equals(fechaInicial)))) {
                listaTemporal3 = listaTemporal5.get(j).getEncomiendaList();
                BigDecimal montoEncomienda = new BigDecimal(0);
                for (int i = listaTemporal3.size() - 1; i >= 0; i--) {
                    if (listaTemporal3.get(i).getEncEstado()!= 2 && listaTemporal3.get(i).getEncPagado() == true && listaTemporal3.get(i).getTipopago().getIdTipoPago() == 1 && ((listaTemporal3.get(i).getEncFecha().after(fechaInicial) && listaTemporal3.get(i).getEncFecha().before(fechaFinal)) || (listaTemporal3.get(i).getEncFecha().equals(fechaInicial)) || (listaTemporal3.get(i).getEncFecha().equals(fechaFinal)))) {
                        lista3.add(listaTemporal3.get(i));
                        montoEncomienda = montoEncomienda.add(listaTemporal3.get(i).getEncTotal());
                    }
                    
                }
                lista5.add(listaTemporal5.get(j));
                listaTemporal5.get(j).setViaPrecio(montoEncomienda);
                montofinalEncomienda = montofinalEncomienda.add(montoEncomienda);

            }
        }

        lista1 = new LinkedList<Egresos>();
        montofinalEgresos = new BigDecimal(0);
        List<Egresos> listaTemporal1 = new LinkedList<Egresos>();
        listaTemporal1 = EgresosFacade.findAll();
        for (int i = listaTemporal1.size() - 1; i >= 0; i--) {
            if (listaTemporal1.get(i).getEgreEstado() == true) {
                if ((listaTemporal1.get(i).getEgreFecha().after(fechaInicial) && listaTemporal1.get(i).getEgreFecha().before(fechaFinal)) || (listaTemporal1.get(i).getEgreFecha().equals(fechaInicial)) || (listaTemporal1.get(i).getEgreFecha().equals(fechaFinal))) {
                    lista1.add(listaTemporal1.get(i));
                    montofinalEgresos = montofinalEgresos.add(listaTemporal1.get(i).getEgreMonto());
                }
            }
        }

        saldoNeto = (montofinalIngresos.add(montofinalVentas).add(montofinalEncomienda).add(postergados)).subtract(montofinalEgresos);
        montoTotalIngresos = montofinalIngresos.add(montofinalVentas).add(montofinalEncomienda).add(postergados);

//        fechaFinal = null;
//        fechaInicial = null;
    }

    public String formatearFecha(Date fecha) {
        String fechaformateada = "";
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        fechaformateada = (df.format(fecha));
        return fechaformateada;
    }
}
